package top.canyue.eca_manager.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import top.canyue.eca_manager.bean.Result;
import top.canyue.eca_manager.service.ConferenceService;

/**
 * 会议数据RESTful API
 *
 * @author canyue
 */

@RestController
@RequestMapping(value = "/api/Conference")
public class ConferenceController {
    @Autowired
    ConferenceService conferenceService;

    /**
     * 基于会议ID得到会议信息
     * @param id 会议ID
     */
    @RequestMapping(value = "/findById",method = RequestMethod.GET)
    public Result findById(@RequestParam String id){
        return conferenceService.findById(id);
    }

    /**
     * 基于会议名称匹配到的会议信息,会议名称支持模糊查询
     * @param name 会议名
     * @param orders 排序，例如"name DESC" 默认 "createTime ASC"
     * @param offset 偏移量，应大于等于0
     * @param fetchSize 一页条目数，应大于等于1
     * @return 会议信息列表
     */
    @RequestMapping(value = "/findByName",method = RequestMethod.GET)
    public Result findByName(@RequestParam String name, @RequestParam String orders, @RequestParam Integer offset, @RequestParam Integer fetchSize) {
        return conferenceService.findConferenceByName(name, orders, offset, fetchSize);
    }

    /**
     * 基于会议名称匹配到的会议数量,会议名称支持模糊查询
     *
     * @param name 会议名
     * @return 会议数量
     */
    @RequestMapping(value = "/getCountByName", method = RequestMethod.GET)
    public Result getCountByName(String name) {
        return conferenceService.getCountByName(name);
    }

    /**
     * 用来添加一场会议
     * @param name 会议名称
     * @param address 会议地点
     * @param startTime 会议开始时间
     * @param endTime 会议结束时间
     * @param comm 会议描述
     * @return 返回内容这种包含会议UUID
     */
    @RequestMapping(value = "/addConference",method = RequestMethod.POST)
    public Result addConference(
            @RequestParam String name,
            @RequestParam String address,
            @RequestParam long startTime,
            @RequestParam long endTime,
            @RequestParam String comm
    ){
        return conferenceService.addConference(name, address, startTime, endTime, comm);
    }

    /**
     * 更新会议信息
     * @param id 会议ID
     * @param name 会议名称
     * @param address 会议地址
     * @param startTime 会议起始时间
     * @param endTime 会议结束时间
     * @param comm 会议描述
     */
    @RequestMapping(value = "/updateConferenceInfo",method = RequestMethod.POST)
    public Result updateConferenceInfo(
            @RequestParam String id,
            @RequestParam String name,
            @RequestParam String address,
            @RequestParam long startTime,
            @RequestParam long endTime,
            @RequestParam String comm
    ){
        return conferenceService.updateConferenceInfo(id, name, address, startTime, endTime, comm);
    }

    /**
     * 删除会议,本接口使用软删除实现
     * @param id 会议ID
     * @return
     */
    @RequestMapping(value = "/deleteById",method = RequestMethod.POST)
    public Result deleteById(@RequestParam String id){
        return conferenceService.deleteById(id);
    }

    /**
     * 获取所有未删除的未来的会议数
     * @return count 会议数
     */
    @RequestMapping(value = "/getCountByFuture",method = RequestMethod.GET)
    public Result getCount(){
        return conferenceService.getCountByFuture();
    }

    /**
     * 获取所有未删除的今日的会议数
     * @return count 会议数
     */
    @RequestMapping(value = "/getCountByToday",method = RequestMethod.GET)
    public Result getCountByToday(){
        return conferenceService.getCountByToday();
    }

    /**
     * 得到用户最近一场会议信息
     * @param userId 用户ID
     * @return 会议信息
     */
    @RequestMapping(value = "/getFirstConferenceByUserId", method = RequestMethod.GET)
    public Result getFirstConferenceByUserId(@RequestParam String userId) {
        return conferenceService.getFirstConferenceByUserId(userId);
    }

    /**
     * 一个轻量化的接口，只返回未被删除的会议ID和会议名
     *
     * @return 会议ID、会议名
     */
    @RequestMapping(value = "/getAllConferenceName", method = RequestMethod.GET)
    public Result getAllConferenceName() {
        return conferenceService.getAllConferenceName();
    }

    /**
     * 基于用户ID，得到某一天的所有会议
     * @param userId 用户ID
     * @param year   年
     * @param month  月
     * @param day    日
     * @return 会议列表
     * 本接口SQL实现，索引失效，待优化
     */
    @RequestMapping(value = "/getUserConferenceByDay", method = RequestMethod.GET)
    public Result getUserConferenceByDay(@RequestParam String userId, @RequestParam int year, @RequestParam int month, @RequestParam int day) {
        return conferenceService.getUserConferenceByDay(userId, year, month, day);
    }

    /**
     * 返回某个用户，某个月下，那几天有会议
     * @param userId 用户ID
     * @param year   年
     * @param month  月
     * @return 列表，那几天
     * 这名字 真**长 想不到好的名字 算了先这样
     */
    @RequestMapping(value = "/getUsersHaveConferenceDaysByMonth", method = RequestMethod.GET)
    public Result getUsersHaveConferenceDaysByMonth(@RequestParam String userId, @RequestParam int year, @RequestParam int month) {
        return conferenceService.getUsersHaveConferenceDaysByMonth(userId, year, month);
    }

}
